西瓜书4 决策树

吴恩达机器学习 决策树

4.1 决策树基本概念

决策过程的每一次判定都是对某一属性的“测试”,决策最终结论则对应最终的判定结果。一般一颗决策树包含:一个根节点、若干个内部节点和若干个叶子节点,易知:

4.2 决策树的构造

决策树的构造是一个递归的过程,有三种情形会导致递归返回:(1) 当前结点包含的样本全属于同一类别,这时直接将该节点标记为叶节点,并设为相应的类别;
(2) 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分,这时将该节点标记为叶节点,并将其类别设为该节点所含样本最多的类别;
(3) 当前结点包含的样本集合为空,不能划分,这时也将该节点标记为叶节点,并将其类别设为父节点中所含样本最多的类别。
算法的基本流程如下图所示:
Pasted image 20250320162220.png

直观理解💡

先看数据 D 是不是“纯净”(第2-4行):如果所有样本的标签都一样(比如全是“狗”),就不用再分了,直接把这个标签记在节点上,返回。

再看特征集 A 或者数据 D 是不是用完了(第5-7行):如果没特征可用,或者数据里特征值都一样,那就挑一个最多的标签当答案,返回。

如果还能分(第8-16行),就从 A 里挑一个最厉害的特征 a (比如“四条腿?”),然后根据这个特征的每个可能值(是/否),把数据分成几份(比如“四条腿的”和“不是四条腿的”),对每份数据再递归调用自己,继续种树。

它的核心是“挑特征”和“递归”,就像你种树时先选主干,再长树杈。最难的是啥?挑“最优特征” a (第8行)咋挑?得用数学方法(比如信息增益),不然树会歪,预测就不准了。

可以看出:决策树学习的关键在于如何选择划分属性,不同的划分属性得出不同的分支结构,从而影响整颗决策树的性能。属性划分的目标是让各个划分出来的子节点尽可能地“纯”,即属于同一类别。因此下面便是介绍量化纯度的具体方法,决策树最常用的算法有三种:ID3,C4.5和CART。

4.2.1 ID3算法 信息增益

4.2.2 C4.5算法 增益率

4.2.3 CART算法

分类与回归树(Classification and Regression Trees)

Gini(D)=1k=1|Y|pk2

基尼指数(Gini Index)Gini(D) 反映了从数据集 D 中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D) 越小,则数据集 D 的纯度越高

属性 a 的基尼指数定义:Gini_index(D,a)=v=1V|Dv||D|Gini(Dv)
a=argminaAGain_index(D,a)

在构造 CART 决策树时,并不会严格按照此式来选择最优划分属性,主要是因为 CART 决策树是一棵二叉树,如果用上式去选出最优划分属性,无法进一步选出最优划分属性的最优划分点。
(基尼指数这个公式适合多叉树,比如属性“天气”有三个取值(晴、雨、阴),直接分成三份。但 CART 是二叉树,它要求每次只能分成两份。如果只用这个公式挑了个属性(比如“天气”),你还是不知道具体怎么分两份——是“晴 vs 非晴”?还是“雨 vs 非雨”?光选属性不够,还得定一个具体的“点”来切开数据。所以,CART 不用这个公式直接选属性,而是换了个更适合二叉树的办法。)

常用的 CART 决策树的构造算法如下:

4.3 剪枝处理

从决策树的构造流程中我们可以直观地看出:不管怎么样的训练集,决策树总是能很好地将各个类别分离开来,这时就会遇到之前提到过的问题:过拟合(overfitting),即太依赖于训练样本。剪枝(pruning)则是决策树算法对付过拟合的主要手段,剪枝的策略有两种如下:

评估指的是性能度量,即决策树的泛化性能。之前提到:可以使用测试集作为学习器泛化性能的近似,因此可以将数据集划分为训练集和测试集。预剪枝表示在构造数的过程中,对一个节点考虑是否分支时,首先计算决策树不分支时在测试集上的性能,再计算分支之后的性能,若分支对性能没有提升,则选择不分支(即剪枝)。后剪枝则表示在构造好一颗完整的决策树后,从最下面的节点开始,考虑该节点分支对模型的性能是否有提升,若无则剪枝,即将该节点标记为叶子节点,类别标记为其包含样本最多的类别。

未剪枝決策树:
8.png
预剪枝决策树:
9.png
后剪枝决策树:
10.png

预剪枝处理使得决策树的很多分支被剪掉,因此大大降低了训练时间开销,同时降低了过拟合的风险,但另一方面由于剪枝同时剪掉了当前节点后续子节点的分支,因此预剪枝“贪心”的本质阻止了分支的展开,在一定程度上带来了欠拟合的风险。而后剪枝则通常保留了更多的分支,因此采用后剪枝策略的决策树性能往往优于预剪枝,但其自底向上遍历了所有节点,并计算性能,训练时间开销相比预剪枝大大提升。

4.4 连续值与缺失值处理

连续值处理

  1. 连续属性离散化的基本思想
    决策树中,连续属性(比如温度、身高等)具有无限多个可能取值,无法像离散属性那样直接用于划分数据集。
    二分法的核心:给定样本集 D 和连续属性 a,二分法试图找到一个划分点 t,将 D 分为两部分:
    Dt:属性 a 的取值满足 at 的样本子集。
    Dt+:属性 a 的取值满足 a>t 的样本子集。
    目标:找到一个最优的 t,使得划分后的子集在某种准则下(如纯度更高)表现最佳。

  2. 划分点的选择
    为了找到最佳划分点 t,CART 需要系统地考察所有可能的候选划分点。具体步骤如下:
    排序
    假设连续属性 a 在样本集 D 上有 n 个不同的取值,将这些取值从小到大排序,记为 {a1,a2,,an}
    生成候选划分点
    对于任意相邻的取值 aiai+1,在区间 [ai,ai+1) 中选择一个点作为候选划分点。
    通常选择中位点 ai+ai+12 作为候选划分点,因为在 [ai,ai+1) 内的任意 t 产生的划分结果相同。
    因此,候选划分点集合为:

Ta={ai+ai+12|1in1}

总共有 n1 个候选划分点。
逐一评估
Ta 中的每个 t,计算划分后的某种指标(如信息增益或基尼指数),选择最优的 t

  1. 信息增益的计算
    信息增益的定义: 对于样本集 D 和属性 a 在划分点 t 上的信息增益 Gain(D,a,t),计算公式为:
Gain(D,a,t)=Ent(D)λ{,+}|Dtλ||D|Ent(Dtλ)

其中:
Ent(D):划分前数据集 D 的熵,表示数据的混乱程度。
Dtat 的子集。
Dt+a>t 的子集。
|Dtλ|:子集 DtDt+ 的样本数。
Ent(Dtλ):子集的熵。
|D|:数据集 D 的总样本数。

最佳划分点: 对 Ta 中的每个 t 计算 Gain(D,a,t),选择使信息增益最大的 t

Gain(D,a)=maxtTaGain(D,a,t)

缺失值处理

  1. 缺失值填充方法
    假设:数据集中的样本是基于独立同分布(i.i.d.)采样得到的。
    常用的缺失值填充方法如下:
    连续属性:使用该属性的均值进行填充。
    离散属性:使用该属性值中个数最多的样本值(即众数)进行填充。
    这种方法简单高效,但在属性值缺失的情况下,决策树的构建还需要更细致的处理方式,如下所述。

  2. 定义与符号
    给定训练集 D 和属性 a,属性 aV 个可取值 a1,a2,,aV。以下是相关定义:
    D~D 中在属性 a 上没有缺失值的样本子集
    D~vD~ 中在属性 a 上取值为 av 的样本子集
    D~kD~ 中属于第 k (k=1,2,...,|Y|) 类的样本子集
    wx:样本 x 的权重
    无缺失值样本所占比例:$$\rho=\frac{\sum_{x\in \widetilde{D} }w_x}{\sum_{x\in {D} }w_x}$$
    无缺失值样本中第 k 类所占的比例:$$\widetilde{p}k=\frac{\sum{x\in \widetilde{D}k }w_x}{\sum{x\in \widetilde{D} }w_x}$$
    无缺失值样本中在属性 a 上取值 av 的样本所占比例:$$\widetilde{r}v=\frac{\sum{x\in \widetilde{D}^v }w_x}{\sum_{x\in \widetilde{D} }w_x}$$

Gain(D,a)=ρ×Gain(D~,a)=ρ×[Ent(D~)v=1Vr~vEnt(D~v)]

其中:Ent(D~)=k=1|Y|p~klog2p~k

  1. 属性选择:如何在属性值缺失的情况下选择划分属性?
    在属性值缺失的情况下,属性选择仅基于无缺失值样本子集 D 来判断属性 a 的优劣。具体方法是通过计算信息增益 Gain(D,a) 来评估属性 a 的划分能力。
    信息增益的计算公式为:
Gain(D,a)=ρ×Gain(D~,a)

其中:

Gain(D~,a)=Ent(D~)v=1Vr~vEnt(D~v)

Ent(D~) 的定义为:

Ent(D~)=k=1|Y|p~klog2p~k

解释:
Ent(D~) 表示无缺失值样本子集 D~ 的熵,衡量其类别的不确定性。
v=1Vr~vEnt(D~v) 表示按属性 a 划分后各子集的加权熵。
ρ 是无缺失值样本的比例,用于对信息增益进行加权调整,确保考虑缺失值的影响。

因此,属性选择的步骤是:
计算 D 的信息增益 Gain(D~,a)
ρ 加权得到 Gain(D,a)
比较各属性的 Gain(D,a),选择信息增益最大的属性作为划分属性。

  1. 样本划分:给定划分属性后如何处理缺失值样本?
    在确定划分属性 a 后,需要将样本划入对应的子结点。根据样本在属性 a 上的取值是否已知,划分方法分为两种情况:

(1)样本在属性 a 上的取值已知
划分规则:若样本 x 在属性 a 上的取值为 av(已知),则将 x 划入与 av 对应的子结点。
权值处理:样本 x 在子结点中的权值保持为 wx

(2)样本在属性 a 上的取值未知
划分规则:若样本 x 在属性 a 上的取值缺失,则将 x 同时划入所有子结点。
权值处理:样本 x 在与属性值 av 对应的子结点中的权值调整为:
rvwx

其中 rv 是无缺失值样本中属性 a 取值 av 的比例。

直观理解:这种方法让同一个缺失值样本以不同的概率(由 rv 决定)被分配到不同的子结点,反映了属性值的分布情况。

4.5 多变量决策树

如果我们将每个属性视为坐标系中的一个坐标轴,那么d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类意味着在这个坐标空间当中寻找不同类别的分类边界,决策树所形成的分类边界有一个非常重要的特点,那便是:轴平行(axis-parallel),即其分类边界由若干个与坐标轴平行的分段组成:
Pasted image 20250320185827.png

如下图所示,分类边界的每一段都会和坐标轴平行,这样的分类边界能够具有很好的可解释性,并且每一个分段的划分都能直接对应某个属性取值。
Pasted image 20250320185851.png

如果我们能够使用斜的划分边界,如图所示,那么决策树的模型将大大简化,”多变量决策树“能够实现相应的斜划分,甚至能够实现更加复杂的决策树:
Pasted image 20250320185907.png

具体的划分出的决策树形式为:
Pasted image 20250320185917.png